<?php

use fastphp\facade\Router;

/**
 * FastPHP核心框架
 */
class Fast
{

    // 运行程序
    function run()
    {
        spl_autoload_register(array($this, 'loadClass'));
        $this->setReporting();
        $this->removeMagicQuotes();
        $this->unregisterGlobals();
        $this->callHook();
    }

    // 主请求方法，主要目的是拆分URL请求
    function callHook()
    {
        $this->getUrl();
        /*$urlArray = explode("/", $this->getUrl());

        array_shift($urlArray);
        // 获取控制器名
        $controllerName = ucfirst(empty($urlArray[0]) ? 'Index' : $urlArray[0]);
        $controller = $controllerName . 'Controller';

        // 获取动作名
        array_shift($urlArray);
        $action = empty($urlArray[0]) ? 'index' : $urlArray[0];

        //获取URL参数
        array_shift($urlArray);
        $queryString = empty($urlArray) ? array() : $urlArray;

        // 数据为空的处理
        $action = empty($action) ? 'index' : $action;
        $queryString = empty($queryString) ? array() : $queryString;

//        var_dump($controller);
//        var_dump($controllerName);
//        var_dump($action);

        // 实例化控制器
        $controller_name = '\application\controllers\\' . $controller;
        $int = new $controller_name($controllerName, $action);
        // 如果控制器存和动作存在，这调用并传入URL参数
        if ((int)method_exists($controller_name, $action)) {
            call_user_func_array(array($int, $action), $queryString);
        } else {
            exit($controller . "控制器不存在");
        }*/

    }

    function getUrl()
    {
        // 获取当前请求的 URI（这里假设是通过 $_SERVER['REQUEST_URI']）
        $requestUri = $_SERVER['REQUEST_URI'];
        // 查找 index.php 的位置
        $indexPhpPos = strpos($requestUri, 'index.php/');

        if ($indexPhpPos !== false) {
            // 截取 index.php 后面的部分
            $pathAfterIndexPhp = substr($requestUri, $indexPhpPos + strlen('index.php'));

            // 如果路径以 '/' 开头，则保留；否则，添加 '/'
            if ($pathAfterIndexPhp && $pathAfterIndexPhp[0] !== '/') {
                $pathAfterIndexPhp = '/' . $pathAfterIndexPhp;
            }

            // 去除可能的查询字符串
            if (strpos($pathAfterIndexPhp, '?') !== false) {
                $pathAfterIndexPhp = explode('?', $pathAfterIndexPhp)[0];
            }

            // 输出结果
//            return $pathAfterIndexPhp;
        }
        require_once '../route/app.php';

        Router::dispatch($pathAfterIndexPhp??"");

//        var_dump($pathAfterIndexPhp);
        // 分发请求
//        try {
//
//        } catch (Exception $e) {
//            // 处理未匹配到路由的情况，比如显示一个 404 页面
//            require_once DefPage;
//        }
    }

    // 检测开发环境
    function setReporting()
    {
        if (APP_DEBUG) {
            error_reporting(E_ALL);
            ini_set('display_errors', 'On');
        } else {
            error_reporting(E_ALL);
            ini_set('display_errors', 'Off');
            ini_set('log_errors', 'On');
            if(!is_dir(RUNTIME_PATH . 'log')){
                mkdir(RUNTIME_PATH . 'log');
            }
            if(!is_dir(RUNTIME_PATH . 'log/error')){
                mkdir(RUNTIME_PATH . 'log/error');
            }
            $file = date('Ymd').'log';
            if(!is_file(RUNTIME_PATH . 'log/error/'.$file)){
                mkdir(RUNTIME_PATH . 'log/error'.$file);
            }
            ini_set('error_log', RUNTIME_PATH . 'logs/error.log');
        }
    }

    // 删除敏感字符
    function stripSlashesDeep($value)
    {
        $value = is_array($value) ? array_map('stripSlashesDeep', $value) : stripslashes($value);
        return $value;
    }

    // 检测敏感字符并删除 
    function removeMagicQuotes()
    {
        /*if ( get_magic_quotes_gpc() ) {
            $_GET = stripSlashesDeep($_GET );
            $_POST = stripSlashesDeep($_POST );
            $_COOKIE = stripSlashesDeep($_COOKIE);
            $_SESSION = stripSlashesDeep($_SESSION);
        }*/
    }

    // 检测自定义全局变量（register globals）并移除
    function unregisterGlobals()
    {
        if (ini_get('register_globals')) {
            $array = array('_SESSION', '_POST', '_GET', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES');
            foreach ($array as $value) {
                foreach ($GLOBALS[$value] as $key => $var) {
                    if ($var === $GLOBALS[$key]) {
                        unset($GLOBALS[$key]);
                    }
                }
            }
        }
    }

    //自动加载控制器和模型类 
    static function loadClass($class)
    {
        $repPath = str_replace("/fastphp", "", APP_PATH);

        $repRoot = str_replace("/fastphp", "", ROOT);
        $frameworks = $repRoot . $class . NORMAL_EXT;
        $frameworks = str_replace("\\", "/", $frameworks);

//        $controllers = $repPath . 'application/controllers/' . $class . NORMAL_EXT;
        $controllers = $repPath . $class . NORMAL_EXT;
        $controllers = str_replace("\\", "/", $controllers);

//        $models = $repPath . 'application/models/' . $class . NORMAL_EXT;
        $models = $repPath . $class . NORMAL_EXT;
        $models = str_replace("\\", "/", $models);

//        var_dump($frameworks);
//        var_dump($controllers);
//        var_dump($models);
        if (file_exists($frameworks)) {
            // 加载框架核心类
            include $frameworks;
        } elseif (file_exists($controllers)) {
            // 加载应用控制器类
            include $controllers;
        } elseif (file_exists($models)) {
            //加载应用模型类
            include $models;
        } else {
            /* 错误代码 */
//            echo 'Error';
        }
    }

}